package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import model.Anuncio;
import model.Associado;
import model.Categoria;

public class AnuncioDAO {
	private Connection connection;

	public AnuncioDAO() throws SQLException {
		this.connection = ConnectionFactory.getConnection();
	}

	public void cadastraPergunta(long idAnuncio, long idAssociado, String pergunta) throws SQLException {
		PreparedStatement stmt = this.connection.prepareStatement("insert into pergunta (idAnuncio, idAssociado, pergunta) values (?,?,?)");
	
		stmt.setLong(1,idAnuncio);
		stmt.setLong(2,idAssociado);
		stmt.setString(3,pergunta);		
		
		stmt.execute();
		stmt.close();
	}
	
	public void adiciona(Anuncio anuncio) throws SQLException {

		PreparedStatement stmt = this.connection.
			prepareStatement("insert into anuncio (titulo, idCategoria, descricao, tags, idAssociado) values (?,?,?,?,?)");
		
		stmt.setString(1,anuncio.getTitulo());
		stmt.setLong(2,anuncio.getCategoria().getIdCategoria());
		stmt.setString(3,anuncio.getDescricao());
		stmt.setString(4,anuncio.getTags());
		stmt.setLong(5,anuncio.getAssociado().getIdAssociado());
		
		
		stmt.execute();
		stmt.close();
	}
	
	public List<Anuncio> getLista() throws SQLException {
		
		PreparedStatement stmt = 
			this.connection.prepareStatement("select * from anuncio;");
		ResultSet rs = stmt.executeQuery();
		
		List<Anuncio> anuncios = new ArrayList<Anuncio>();		
		while (rs.next()) {

			Anuncio anuncio = new Anuncio();
			carregaAnuncio(rs, anuncio);			
			anuncios.add(anuncio);
		}

		rs.close();
		stmt.close();
		return anuncios;
	}

	public List<Anuncio> getLista(String tag) throws SQLException {
		
		String busca = "";
		String[] palavras  = tag.split(" ");
		for( int i=0; i < palavras.length; i++ ){
			 busca = busca + "tags like '%" + palavras[i] + "%' ";
			 busca = busca + "or ";
		}
		busca = busca.substring(0, busca.length() - 3 );
		
		PreparedStatement stmt = 
			this.connection.prepareStatement("select * from anuncio where " + busca);
		ResultSet rs = stmt.executeQuery();
		
		List<Anuncio> anuncios = new ArrayList<Anuncio>();		
		while (rs.next()) {

			Anuncio anuncio = new Anuncio();
			carregaAnuncio(rs, anuncio);			
			anuncios.add(anuncio);
		}

		rs.close();
		stmt.close();
		return anuncios;
	}

	
	private void carregaAnuncio(ResultSet rs, Anuncio anuncio)
			throws SQLException {
				
		anuncio.setAssociado(new AssociadoDAO().getAssociado(Long.parseLong(rs.getString("idAssociado"))));
		anuncio.setCategoria(new CategoriaDAO().getCategoria(Long.parseLong(rs.getString("idCategoria"))));
		anuncio.setDescricao(rs.getString("descricao"));
		anuncio.setIdAnuncio(Long.parseLong(rs.getString("idAnuncio")));
		anuncio.setTags(rs.getString("tags"));
		anuncio.setTitulo(rs.getString("titulo"));
		anuncio.setPerguntas(new PerguntaDAO().getLista(anuncio));
	}

	public void altera(Anuncio anuncio) throws SQLException {
		PreparedStatement stmt = 
			connection.prepareStatement("update anuncio set titulo=?, idSubCategoria=?, descricao=?, tags=?, idAssociado=?  where idAnuncio=?");
		
		stmt.setString(1, anuncio.getTitulo());
		stmt.setLong(2, anuncio.getCategoria().getIdCategoria());
		stmt.setString(3, anuncio.getDescricao());
		stmt.setString(4, anuncio.getTags());
		stmt.setLong(8, anuncio.getAssociado().getIdAssociado());

		stmt.execute();
		stmt.close();
	}

	public void remove(Anuncio anuncio) throws SQLException {
		PreparedStatement stmt = 
			connection.prepareStatement("delete from anuncio where idanuncio=?");
		stmt.setLong(1, anuncio.getIdAnuncio());
		stmt.execute();
		stmt.close();
	}
	
	public Anuncio getAnuncio(Long idAnuncio) throws SQLException {
		PreparedStatement stmt = 
			this.connection.prepareStatement("select * from anuncio where idanuncio=?");
		stmt.setLong(1, idAnuncio );
		ResultSet rs = stmt.executeQuery();
		
		boolean existeUm = rs.next();
		if( existeUm && rs.next() ) {
			existeUm = false;
		}
		
		Anuncio anuncio = null;
		if (existeUm) {
			rs.first();
			anuncio = new Anuncio();
			carregaAnuncio(rs, anuncio);		
		}

		rs.close();
		stmt.close();
		return anuncio;

	}
	
	private List<String> getPerguntas(long idAnuncio) throws SQLException {

		PreparedStatement stmt = this.connection.prepareStatement("select * from pergunta where idanuncio=?");
		stmt.setLong(1, idAnuncio );
		
		ResultSet rs = stmt.executeQuery();		
		List<String> perguntas = new ArrayList<String>();		
		while (rs.next())
			perguntas.add(rs.getString("pergunta"));
		

		rs.close();
		stmt.close();

		return perguntas;

	}

}
